#include "desktopwindow.h"

#include <QDebug>

DesktopWindow::DesktopWindow(int id, QScreen *screen)
    : UkuiQuick::IslandView("desktop", "ukui-quick-desktop")
{
    rootContext()->setContextProperty("desktopWindow", this);

    m_id = id;
    m_screen = screen;

    m_model = new QStandardItemModel(this);
    if (id == 1) {
        m_model->appendRow(new QStandardItem("1"));
        m_model->appendRow(new QStandardItem("3"));
        m_model->appendRow(new QStandardItem("5"));
        m_model->appendRow(new QStandardItem("7"));
        m_model->appendRow(new QStandardItem("9"));
    } else {
        m_model->appendRow(new QStandardItem("2"));
        m_model->appendRow(new QStandardItem("4"));
        m_model->appendRow(new QStandardItem("6"));
        m_model->appendRow(new QStandardItem("8"));
        m_model->appendRow(new QStandardItem("10"));
    }

    rootContext()->setContextProperty("itemModel", m_model);

    setScreen(screen);
    loadMainView("org.ukui.quick.frameworktest", m_id);

    for (auto config: mainView()->config()->children(QStringLiteral("widgets"))) {
        qDebug() << "plugin widgets" << config->getValue("id").toString();
    }
}

int DesktopWindow::id() const
{
    return m_id;
}

void DesktopWindow::setId(int newId)
{
    if (m_id == newId)
        return;
    m_id = newId;
    emit idChanged();
}

QScreen *DesktopWindow::screen() const
{
    return m_screen;
}

void DesktopWindow::setScreen(QScreen *newScreen)
{
    if (m_screen == newScreen)
        return;
    m_screen = newScreen;
    emit screenChanged();
}

void DesktopWindow::addWidget(const QString &customString)
{
    auto widget = mainView()->widgetLoader().loadWidget("org.ukui.testWidget");
//    auto config = new UkuiQuick::Config(QVariantMap(), mainView());
//    widget->setConfig(config);
    // fixme，如果在addWidget之前设置config，需要手动new才能生效，并且这个config没办法保存数据
    // 如果在addWidget之后设置config，界面上的数据需要经过一次变动，对于复杂的数据场景这个变动不太合适
    // 此问题可能需要在ukui-quick中解决

    widget->setInstanceId(mainView()->widgets().count());
    mainView()->addWidget(widget);

    // 通过配置向插件窗口传递数据，配置可以是一个能够和外接互通的句柄，比如proxyModel的id
    // 插件中通过这个id创建对应的proxyModel（在cpp中注册，qml中使用），这样就能够展示不同的数据
    // 这里设置了一个字符串用于演示效果
    if (!customString.isEmpty()) {
        widget->config()->setValue("customString", customString);
    }  else {
        widget->config()->setValue("customString", "Empty Custom String");
    }
}

void DesktopWindow::removeWidget()
{
    if (!mainView()->widgets().isEmpty()) {
        mainView()->removeWidget(mainView()->widgets().last());
    }
}

void DesktopWindow::clearAll()
{
    for (auto widget : mainView()->widgets()) {
        mainView()->removeWidget(widget);
    }
}
